﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Threading;

namespace TTApp.Phone.Silverlight.Hexagons
{
    /// <summary>
    /// Màn chơi đấu với máy.
    /// </summary>
    public partial class AIClassicGame : ClassicGame
    {
        /// <summary>
        /// Danh sách lưu tất cả các nước có thể đi hiện tại
        /// </summary>
        private List<RouteHexagonSlot> listChoice = new List<RouteHexagonSlot>();

        DispatcherTimer timer = new DispatcherTimer();

        #region //----------------------------- Class Public Constructors ---------------------------------//
        /// <summary>
        /// Tạo 1 đối tượng AIClassicGame mới.
        /// </summary>
        public AIClassicGame()
        {
            InitializeComponent();
            
            _xmlDataFile = "/Assets/Data/AIClassicMap.xml";
            PlayerChanged += new EventHandler<PlayerChangedEventArgs>(OnPlayerChanged);

            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += new EventHandler(OnTimerTick);
        }
        #endregion

        #region //----------------------------- Private Event Handlers ------------------------------------//

        /// <summary>
        /// Xử lý code logic của AI.
        /// 
        /// Có 3 cách để lấy người chơi trong lượt hiện tại (người chơi này chính là AI)
        ///    - args.NewPlayer as AIPlayer
        ///    - _currentPlayer của lớp GameBase
        ///    - _player2 của lớp ClassicGame
        /// </summary>
        private void OnPlayerChanged(object sender, PlayerChangedEventArgs args)
        {
            if (args.NewPlayer is AIPlayer)
            {
                timer.Start();
            }
        }

        private void OnTimerTick(object sender, EventArgs args)
        {
            this.BrowseAllAvailableChoice();
            RouteHexagonSlot nextTurn = this.GetMaxRouteHexagonSlot();
            if (nextTurn != null)
            {
                if (nextTurn.StartHexagonSlot.GetNeighbours(1).Contains(nextTurn.EndHexagonSlot))
                    SpawnHexagon(nextTurn.StartHexagonSlot.Hexagon, nextTurn.EndHexagonSlot);
                else
                    JumpToHexagonSlot(nextTurn.StartHexagonSlot.Hexagon, nextTurn.EndHexagonSlot);
            }
            timer.Stop(); 
        }

        /// <summary>
        /// Lấy tất các các nước đi có thể có của người chơi hiện tại
        /// </summary>
        private void BrowseAllAvailableChoice()
        {
            listChoice.Clear();
            foreach (HexagonSlot hexagonSlot in _board.HexagonSlots)
            {
                if (!hexagonSlot.IsEmpty)
                    if (hexagonSlot.Hexagon.Owner == _currentPlayer)
                    {
                        //Xet cac truong hop nhay ra Level 1
                        List<HexagonSlot> neighboursLevel1 = hexagonSlot.GetNeighbours(1);
                        foreach (HexagonSlot neighbourLevel1 in neighboursLevel1)
                            if (neighbourLevel1 != null)
                                if (neighbourLevel1.IsEmpty)
                                {
                                    RouteHexagonSlot routeHexagonSlot = new RouteHexagonSlot(hexagonSlot, neighbourLevel1);
                                    listChoice.Add(routeHexagonSlot);
                                }
                        //Xet cac truong hop nhay ra Level 2
                        List<HexagonSlot> neighboursLevel2 = hexagonSlot.GetNeighbours(2);
                        foreach (HexagonSlot neighbourLevel2 in neighboursLevel2)
                            if (neighbourLevel2 != null)
                                if (neighbourLevel2.IsEmpty)
                                {
                                    RouteHexagonSlot routeHexagonSlot = new RouteHexagonSlot(hexagonSlot, neighbourLevel2);
                                    listChoice.Add(routeHexagonSlot);
                                }
                    }
            }
        }

        /// <summary>
        /// Lấy về cách đi có lợi thế nhiều nhất hiện tại
        /// </summary>
        /// <returns>Cách đi có lợi thế nhiều nhất hiện tại</returns>
        private RouteHexagonSlot GetMaxRouteHexagonSlot()
        {
            if (listChoice.Count == 0)
                return null;
            List<RouteHexagonSlot> listMaxRouteHexagonSlot = new List<RouteHexagonSlot>();
            listMaxRouteHexagonSlot.Add(listChoice[0]);
            foreach (RouteHexagonSlot rhs in listChoice)
            {
                if (rhs.Point > listMaxRouteHexagonSlot[0].Point)
                {
                    listMaxRouteHexagonSlot.Clear();
                    listMaxRouteHexagonSlot.Add(rhs);
                }
                else if (rhs.Point == listMaxRouteHexagonSlot[0].Point)
                {
                    listMaxRouteHexagonSlot.Add(rhs);
                }
            }
            Random random = new Random();
            return listMaxRouteHexagonSlot[random.Next(listMaxRouteHexagonSlot.Count)];
        }
        
        #endregion
    }
}
